預設的 Kubernetes 提供了幾個 namespace
用於不同的目的,下面的結果在 GKE 或 kubeadm 上目前使用是一樣的,至於 namespace
名稱的用途可參考此鏈接
$ kubectl get namespace
NAME STATUS AGE
default Active 13h
kube-node-lease Active 13h
kube-public Active 13h
kube-system Active 13h
針對某一個特定 namespace
進行詳細訊息查看
$ kubectl describe namespaces default
如果使用了 namespace
將一些應用進行隔離,我們要查看特定 namespace
下資源時須使用 -n
參數進行切換,預設是在 default
上。下面結果是 GKE
的環境。
$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
event-exporter-v0.3.0-5cd6ccb7f7-mp7p4 2/2 Running 0 13h
fluentd-gcp-scaler-6855f55bcc-mchvv 1/1 Running 0 13h
fluentd-gcp-v3.1.1-f8wc8 2/2 Running 0 13h
fluentd-gcp-v3.1.1-g6mbn 2/2 Running 0 13h
fluentd-gcp-v3.1.1-zq4xm 2/2 Running 0 13h
heapster-gke-7c7bdf567c-cmqhm 3/3 Running 0 13h
kube-dns-5c446b66bd-5ltbw 4/4 Running 0 13h
kube-dns-5c446b66bd-fqvwk 4/4 Running 0 13h
...
我們拿上一章節的實驗來做說明。
定義 namespace
清單。
apiVersion: v1
kind: Namespace
metadata:
name: test
使用 create
建立該清單的資源。
$ kubectl creat -f namespace-example.yaml
$ kubectl get namespace # 這邊會看到所建立的 test namespace 資源
直接建立
$ kubectl create namespace prod
上面說了建立,在刪除方面只要刪除了 namespace
會刪除與其相關的資源。下面顯示了刪除的方式,ns
為 namespace
縮寫。
$ kubectl delete ns test
namespace "test" deleted
POD
是 Kubernetes 中的一個核心組件,可以將其用 json
或 yaml
各式定義乘資源清單,最後由聲明式或宣告式進行資源管理。整個流程如下圖,用戶透過 create
或 apply
將資源清單請求提交至 API Server
並將其保存至集群狀態儲存系統 etcd
中,之後由調度元件把用戶請求調度至最佳節點,而被選中節點將借助 kubectl
和 CRI
進行容器建立。這種由客戶端直接由 API Server
建立的 POD
稱作為自主式 POD。
我們使用 yaml 定義資源清單,但 Api Server 會將其轉 JSON 再執行
POD 是用於容器相關應用,因此在 spec
字段中需要定義 containers
,它為容器的列表,可以建立多個容器。下面為一個 POD 資源清單範例
apiVersion: v1
kind: Pod
metadata:
name: pod-demo # POD 名稱
namespace: default # 選擇 namespace
labels: # 標籤
app: myapp
tier: frontend
spec:
containers: # 定義容器
- name: myapp
image: nginx:1.18
- name: busybox
image: busybox:latest
command: ["bin/sh", "-c", "sleep 3600"]
使用 create
建立 POD
,-f
可以支援以路徑方式或 URL
。
$ kubectl create -f pod-demo.yaml
pod/pod-demo created
get
通常用來顯示資源對象狀態訊息。使用 -o wide
時可以知道更多訊息。
$ kubectl get pods pod-demo
NAME READY STATUS RESTARTS AGE
pod-demo 2/2 Running 0 10s
$ kubectl get pods pod-demo -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-demo 2/2 Running 0 9m11s 10.4.2.5 gke-cluster-1-default-pool-7dc8b11b-r7rg <none> <none>
describe
可以詳細的描述出 POD
資源的內容,像是 Volume
、QoS
等,當中 event
相當重要,其訊息可檢視出為何 POD
會故障等訊息以用來除錯。
$ kubectl describe pods pod-demo
Name: pod-demo
Namespace: default
Priority: 0
Node: gke-cluster-1-default-pool-7dc8b11b-r7rg/10.128.0.22
Start Time: Sun, 30 Aug 2020 10:56:36 +0000
Labels: app=myapp
tier=frontend
Annotations: kubernetes.io/limit-ranger: LimitRanger plugin set: cpu request for container myapp; cpu request for container busybox
...
正在運行的 POD
上帶有非常多的字段,而並非所有字段都能修改。我們使用 replace
方式進行實驗,我們將修改容器 image
。
先在 yaml
檔將 image
版本從 1.18
變成 1.12
,在執行以下指令。但發現這樣使用出現了錯誤。
$ kubectl replace pods -f pod-demo.yaml
The Pod "pod-demo" is invalid: spec: Forbidden: pod updates may not change fields other than `spec.containers[*].image`, `spec.initContainers[*].image`, `spec.activeDeadlineSeconds` or `spec.tolerations` (only additions to existing tolerations)
core.PodSpec{
- Volumes: nil,
使用以下方式就可以避免上面的失敗。對於 POD
來說,能夠修改的欄位有限,自定義的 yaml
跟系統上面的 yaml
不一樣,因此無法覆蓋,會存在著少資源覆蓋多資源問題。因此在修改時應該是要跟系統 yaml
一模一樣才對,透過 -o yaml
可以取得。在進行 replace
時,無定義的 yaml
都會被檢視出來,反正必須取得當前運行的 yaml
,修改後呼叫 replace
覆蓋。
$ kubectl get pod pod-demo -o yaml > pod-replace-demo.yaml
$ vi pod-replace-demo.yaml
$ kubectl replace -f pod-replace-demo.yaml
pod/pod-demo replaced
$ kubectl describe pod pod-demo # 容器 image 已經更改
當然除了上面方法,還有加 --force
的方式,它會將 POD
資源先刪除並重新建立。
$ kubectl replace -f pod-demo.yaml --force
pod "pod-demo" deleted
pod/pod-demo replaced
$ kubectl describe pod pod-demo # 容器 image 已經更改
而 edit
是另一種方式,像是使用 vi
,它直接編輯了該 POD
完整資訊,因此可以直接利用此方式進行修改。
$ kubectl edit pods pod-demo # 此方式也能進行修改
$ kubectl delete pod pod-demo
pod "pod-demo" deleted
然而,replace
在現實中並非很理想,對於更改的配置難以追蹤,取而代之的是 Declarative object configuration
,可以嘗試將上面的步驟用 apply
取代。
$ kubectl apply -f pod-demo.yaml
我們介紹了 Namespace
操作同時知道 POD
資源配置是由 kind
、apiVersion
、metadata
、spec
和 status
組成。同時也比較 Imperative
和 Declarative
。這邊也學習到使用 create
、delete
、replace
、edit
、apply
等指令應用。